
 // 注意：对未初始化和未声明的变量执行typeof操作符都返回undefined值
 let message
typeof message   // ‘undefined’
alert(message) // undefined
typeof msg // 'undefined' 
alert(msg) // 产生错误

// Boolean类型
Boolean() // false
Boolean(true) // true
Boolean(false) // false
Boolean('22') // true
Boolean('') // false
Boolean(2) // true
Boolean(Infinity) // true
Boolean(0) // false
Boolean(NaN) // false
Boolean(null) // false
Boolean(undefined) // false

console(undefined === undefined)  // true
console(undefined == undefined) // true
console(null === null) // true
console(null === null) // true
console(null == undefined) // true
console(null === undefined) // false


// Number 类型
/** 整数：
 * 八进制： 以8为基数的字面值，八进制字面值的第一位必须是0，然后是八进制数字序列（0～7）
 * 注意： 如果字面值中的数值超出了范围，那么前导0将会被忽略，后面的数值将被当成十进制数值解析
 * 十六进制： 以16为基数，十六进制字面值的前两位必须是0x，后跟任何十六进制数字（0～9及A～F）,
 * 其中a～f可以大写，也可以小写
 */

//保存浮点数值需要的内存空间是保存整数值的两倍
//浮点数值的最高精度是17位小数，但是进行算术计算时其精确度远远不如整数

/**
 * 数值范围
 * Number.MIN_VALUE: 表示最小数值
 * Number.MAX_VALUE: 表示最大数值
 * Infinity： 表示超出js数值范围的数（Infinity，-Infinity： 正无穷、负无穷）
 * isFinite()函数：判断是否在最小与最大数值之间；
 */

 /**
  * NaN
  * 非数值
  * NaN与任何值都不相等
  */
console.log(isNaN(NaN))  // true
console.log(isNaN(10))  // false
console.log(isNaN('10')) // false  '10'可以转换成10
console.log(isNaN('blue')) // true
console.log(isNaN(true)) // false  true可以转换成1

console.log(NaN == NaN) // false

// 数值转换
/**
 * Number(): 可以用于任何数据类型
 * parseInt(): 用于将字符串转化为数值；
 * parseFloat(): 用于将自负床转化为数值；
 */
Number() // 0
Number(true) // 1
Number(false) // 0
Number(null) // 0
Number(undefined) // NaN
Number(NaN) // NaN
Number(Infinity) // Infinity
//字符串中纯数字情况
Number('123www') // NaN
Number('') // 0
Number('0') // 0
Number('011') // 11
Number('0xf') // 15
Number('1.2') // 1.2
//针对对象
Number([2]) // 2

// 使用parseInt()最好习惯使用第二个参数，因为ECMAScriprt 3和5会有冲突
parseInt() // NaN
parseInt('') // NaN
parseInt('0xf', 16) // 15
parseInt('0001111',10) // 1111
parseInt('www123') // NaN
parseInt('123www') // 123
parseInt(22.5) // 22
parseInt('070',8) // 56
parseInt('70',10) // 70

//parseFloat()只解析十进制数
parseFloat() // NaN
parseFloat('1234eeeeww') // 1234
parseFloat('0xf') // 0
parseFloat('22.5') // 22.5
parseFloat('23.4.5') // 22.4
parseFloat('0908.5') // 908.5
parseFloat('3.125e7') // 31250000


// string
/**转换字符串
 * toString(): 除了null和undefined数据类型无此方法，其他都有
 * String()
 */
let a = 11
 console.log(a.toString()) // '11'
 a = true
 console.log(a.toString()) // 'true'
 let b = 10
 console.log(b.toString()) // '10'
 console.log(b.toString(2)) // '1010'
 console.log(b.toString(8)) // '12'
 console.log(b.toString(10)) // '10'
 console.log(b.toString(16)) // 'a'

 let c = true
 let c1 = null
 let c2 = 10
 let c3
 console.log(String()) // ''
 console.log(String(c)) // 'true'
 console.log(String(c1)) // 'null'
 console.log(String(c3)) // 'undefined'
 console.log(String(c2)) // '10'


 //Object类型
 /**
  * construct(): 保存着用于创建当前对象的函数
  * hasOwnProperty(propertyName): 用于检查给定的属性在当前对象实例中（而不是在实例的原型中）
  * 是否存在
  * isPrototypeOf(object): 用于检查传入的对象是否是当前对象的原型
  * propertyIsEnumerable(propertyName): 用于检查给定的属性是否能够使用for-in语句来枚举
  * toLocaleString(): 返回对象的字符串表示，该字符串与执行环境的地区对应
  * toString(): 返回对象的字符串表示
  * valueOf(): 返回对象的字符串、数值或布尔值表示，通常与toString()方法返回值相同
  */

 //注意
 /**
  * 相等操作（==）和不等操作符（！==）遵循规则
  * 这两操作符都会先转换操作数（通常称为强制转换），然后比较它们的相等性
  * 1、如果有一个操作数是布尔值，则在比较相等性之前先将其转换为数值 --- true转换为1，false转换为0
  * 2、如果一个操作数是字符串，另一个操作数是数值，在比较相等性前先将字符串转化成数值
  * 3、null和undefined是相等的，要比较相等性之前，不能将null和undefined转换成其他任何值
  * 4、NaN == NaN  输出false
  * 5、如果两个操作数都是对象，比较它们是不是同一个对象，如果两个操作数
  * 
  */

  console.log(false == 0) // true
  console.log(true == 1) // true
 console.log(null == 0) // false
 console.log(undefined == 0) // false

